package pl.wroc.pwr.mss.server.ui.buttons;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

import org.apache.log4j.Logger;

import pl.wroc.pwr.mss.logic.domain.Playlist;
import pl.wroc.pwr.mss.server.service.PlaylistService;
import pl.wroc.pwr.mss.server.ui.dialogs.JPlaylistEditDialog;
import pl.wroc.pwr.mss.server.ui.tables.JPlaylistTable;
import pl.wroc.pwr.mss.server.ui.tables.JSongTable;
import pl.wroc.pwr.mss.server.ui.tables.models.PlaylistTableModel;
import pl.wroc.pwr.mss.server.ui.tables.models.SongTableModel;
import pl.wroc.pwr.mss.server.util.JTableUtils;

/**
 * Przycisk do zapisywania playlisty w oknie dialogowym edycji playlisty.
 * 
 * @author mjagus
 */
public class JSavePlaylistButton extends JButton implements ActionListener
{
    /**
     * Identyfikator klasy.
     */
    private static final long serialVersionUID = 8543040324312961500L;

    /**
     * Logger tej klasy.
     */
    private static final Logger log = Logger.getLogger(JSavePlaylistButton.class);

    /**
     * Serwis dla encji Playlist.
     */
    private PlaylistService playlistService;

    /**
     * Okno dialogowe edycji playlist.
     */
    private JPlaylistEditDialog playlistEditDialog;

    /**
     * Model danych dla tabeli playlist.
     */
    private PlaylistTableModel playlistTableModel;

    /**
     * Tabela przechowujaca nazwy playlist.
     */
    private JPlaylistTable playlistTable;

    /**
     * Model danych dla tabeli utworow.
     */
    private SongTableModel songTableModel;

    /**
     * Tabela utworow w oknie glownym aplikacji serwerowej.
     */
    private JSongTable songTable;

    /**
     * Iniciuje komponent.
     */
    public JSavePlaylistButton()
    {
        super("Save");

        super.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Playlist playlist = playlistEditDialog.getPlaylist();
        playlist.setName(playlistEditDialog.getPlaylistNameTextField().getText());
        playlistService.save(playlist);
        log.info("Saved playlist: " + playlist.getName());

        playlistTableModel.fireTableDataChanged();
        songTableModel.fireTableDataChanged();
        JTableUtils.adjustColumns(playlistTable);
        JTableUtils.adjustColumns(songTable);
        playlistEditDialog.setVisible(false);
    }

    /**
     * @return Serwis dla encji Playlist
     */
    public PlaylistService getPlaylistService()
    {
        return playlistService;
    }

    /**
     * @return Okno dialogowe do edycji playlisty
     */
    public JPlaylistEditDialog getPlaylistEditDialog()
    {
        return playlistEditDialog;
    }

    /**
     * @return Model danych dla tabeli z playlistami
     */
    public PlaylistTableModel getPlaylistTableModel()
    {
        return playlistTableModel;
    }

    /**
     * @return Tabela przechowujaca nazwy playlist
     */
    public JPlaylistTable getPlaylistTable()
    {
        return playlistTable;
    }

    /**
     * @return Model danych dla tabeli playlist
     */
    public SongTableModel getSongTableModel()
    {
        return songTableModel;
    }

    /**
     * @return Tabela utworow w oknie glownym aplikacji serwerowej
     */
    public JSongTable getSongTable()
    {
        return songTable;
    }

    /**
     * @param playlistService Serwis dla encji Playlist
     */
    public void setPlaylistService(PlaylistService playlistService)
    {
        this.playlistService = playlistService;
    }

    /**
     * @param playlistEditDialog Okno dialogowe do edycji playlisty
     */
    public void setPlaylistEditDialog(JPlaylistEditDialog playlistEditDialog)
    {
        this.playlistEditDialog = playlistEditDialog;
    }

    /**
     * @param playlistTable Tabela przechowujaca nazwy playlist
     */
    public void setPlaylistTable(JPlaylistTable playlistTable)
    {
        this.playlistTable = playlistTable;
    }

    /**
     * @param playlistTableModel Model danych dla tabeli playlist
     */
    public void setPlaylistTableModel(PlaylistTableModel playlistTableModel)
    {
        this.playlistTableModel = playlistTableModel;
    }

    /**
     * @param songTableModel Model danych dla tabeli playlist
     */
    public void setSongTableModel(SongTableModel songTableModel)
    {
        this.songTableModel = songTableModel;
    }

    /**
     * @param songTable Tabela utworow w oknie glownym aplikacji serwerowej
     */
    public void setSongTable(JSongTable songTable)
    {
        this.songTable = songTable;
    }
}
